package aplicacion.modelo;

import java.awt.Point;

public abstract class Fantasma extends Personaje {
	private Point posicionAnterior;
	private EstadoDeFantasma estado;
	private final static int PUNTOS = 250;
	private static int TIEMPO_RESURRECCION = 150;
	
	public Fantasma(Point posicionInicial, int contadorGameloops){
		super(posicionInicial, contadorGameloops);
	}

	public boolean puedoComer() {
		Point posicionPacman=getPacman().getPosicion();
		return (posicionPacman.equals(getPosicion()));
	}
	public void setPosicionAnterior(Point posicionAnterior) {
		this.posicionAnterior = posicionAnterior;
	}

	public Point getPosicionAnterior() {
		return posicionAnterior;
	}
	
	public void reaccionarAntePacman(){
		estado.reaccionarAntePacman();
	}

	public void morir(){		
		Juego.getInstance().aumentarPuntaje(this.getPuntos());
		this.setPosicion(getPosicionInicial());
		setContadorGameloops(TIEMPO_RESURRECCION);
		cazar();
	}
	
	protected void setEstado(EstadoDeFantasma estado) {
		this.estado = estado;
	}
	
	public void huir() {
		setEstado(new FantasmaHuidizo(this));
	}
	
	public void vivir() {
		if(getContadorGameloops() == 0)	{
			chequearSiPuedeComer();
			estado.actuar();
			chequearSiPuedeComer();
		}
		else
			decrementarGameloops(1);
	}

	private void chequearSiPuedeComer() {
		if(puedoComer())
			reaccionarAntePacman();
		else if(getContadorGameloops() == 0)
			setContadorGameloops(estado.getContadorGameloops());
	}
	
	public abstract void cazar();

	public void moverA(Point posicion) {
		Celda celda = Juego.getInstance().getTablero().getCelda(posicion);
		Point posicionTransporteDestino = null;
		
		if (celda instanceof TransporteOrigen) {
			posicionTransporteDestino = Juego.getInstance().getTablero().getPosicionTransporteDestino();
			setPosicionAnterior(posicionTransporteDestino);
			setPosicion(posicionTransporteDestino);			
		}
		else {
			setPosicionAnterior(getPosicion());
			setPosicion(posicion);
		}
	}

	protected Pacman getPacman() {
		return Juego.getInstance().getTablero().getPacman();
	}

	public CeldasVecinas getCeldasVecinas() {
		return Juego.getInstance().getTablero().getCelda(getPosicion()).obtenerCeldasVecinas();
	}

	public int getPuntos() {
		return PUNTOS;
	}

	public EstadoDeFantasma getEstado() {
		return this.estado;
	}

	public static void decrementarTiempoDeResurreccion() {
		if(TIEMPO_RESURRECCION - 10 >= 0)
			TIEMPO_RESURRECCION -= 10;
	}
}
